package com.kfyang.manualgear.util;

import java.util.StringJoiner;
import java.util.regex.Pattern;


public interface StringUtils {
    /**
     * 生成 (？,？,...)
     * @param size 问号数量
     * @return 返回
     */
    static String inList(int size) {
        StringJoiner stringJoiner = new StringJoiner(",", "(", ")");
        for (int i = 0; i < size; i++) {
            stringJoiner.add("?");
        }
        return stringJoiner.toString();
    }

    /**
     * 重复str并用逗号分隔
     * @param str 重复字符串
     * @param size 重复次数
     * @return 返回结果
     */
    static String repeatSeparatedByComma(String str, int size) {
        StringJoiner stringJoiner = new StringJoiner(",");
        for (int i = 0; i < size; i++) {
            stringJoiner.add(str);
        }
        return stringJoiner.toString();
    }

    /**
     * 首字母改为小写
     * @param str 源字符串
     * @return 修改后结果
     */
    static String unCapitalize(String str) {
        return Character.toLowerCase(str.charAt(0)) + str.substring(1);
    }

    /**
     * 将实体类名转换为表名
     * @param entity 实体类名
     * @return 转换后表名
     */
    static String entityToTableName(String entity) {
        return fieldToColumn(unCapitalize(entity));
    }

    /**
     * 将字段名转换为列名
     * @param field 字段名
     * @return 列名
     */
    static String fieldToColumn(String field) {
        return Pattern.compile("[A-Z]").matcher(field)
            .replaceAll(matchResult -> {
                return "_" + Character.toLowerCase(matchResult.group(0).charAt(0));
            });
    }

    /**
     * @param type set 或 get
     * @param field 字段名
     * @return set 或 get 方法
     */
    static String toMethod(String type, String field) {
        return type + Character.toUpperCase(field.charAt(0)) + field.substring(1);
    }

    /**
     * 将字段名转换为对应 get 方法
     * @param field 字段名
     * @return get 方法名
     */
    static String toGetMethod(String field) {
        return toMethod("get", field);
    }

    /**
     * 将字段名转换为对应 set 方法
     * @param field 字段名
     * @return set 方法名
     */
    static String toSetMethod(String field) {
        return toMethod("set", field);
    }
}
